home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 213_01 / cbr.c < prev    next >
Text File  |  1980-01-01  |  9KB  |  553 lines

  1. /* CBR.C    VERS:- 01.00  DATE:- 09/26/86  TIME:- 09:36:10 PM */
  2. /*
  3. %CC1 $1.C -O -X -E5000
  4. %CLINK $1 DIO -S -E5000
  5. %DELETE $1.CRL 
  6. */
  7. /* 
  8. Description:
  9.  
  10. Filter to format C code, from CUG distribution disk.
  11. Indents according to control level.
  12.  
  13. Minor modifications:
  14.     adapted for BDS C v1.50a;
  15.     adapted for use as filter under DIO;
  16.     Corrected: 
  17.         exit test; 
  18.         read of strings of *'s.
  19.  
  20. Best to filter input file first through CBPREP, to produce 
  21. consistent spacing of text and one statment per line.
  22.     
  23. By J.A. Rupley, Tucson, Arizona
  24. Coded for BDS C compiler, version 1.50a
  25. */
  26. /* HEADER: CUG120.03;
  27.    TITLE: C beautifier;
  28.    DATE: 09/28/1981;
  29.    DESCRIPTION: "A pretty-printer for C source code.";
  30.    KEYWORDS: C programming,printing;
  31.    SYSTEM: CP/M;
  32.    FILENAME: CB.C;
  33.    CRC: 595B;
  34.    AUTHORS: William C. Colley, Rick Hollinbeck;
  35.    COMPILERS: BDS C v1.44;
  36. */
  37. /*
  38.     Pretty-printer for C Programs
  39.  
  40.     Swiped from the CIPG's UNIX system and modified to run
  41.         under BDS C by William C. Colley, III
  42.  
  43.     Mods made July 1980
  44.  
  45.     Updated to BDS C, v1.44 by Rick Hollinbeck, 9/28/81
  46.  
  47. To use the program, type the following command line:
  48.  
  49.     A>cb <input.fil [>output.fil or |DIO_pipe or default = crt]
  50.  
  51. where input.fil is the file to be pretty-printed and [output.fil] is an
  52. optional output file.  If no output file is specified, the output is sent
  53. to the console.
  54. */
  55.  
  56. #include "bdscio.h"
  57. #include "dio.h"
  58.  
  59. int slevel[10];
  60. int clevel;
  61. int spflg[20][10];
  62. int sind[20][10];
  63. int siflev[10];
  64. int sifflg[10];
  65. int iflev;
  66. int ifflg;
  67. int level;
  68. int ind[10];
  69. int eflg;
  70. int paren;
  71. int pflg[10];
  72. char lchar;
  73. char pchar;
  74. int aflg;
  75. int ct;
  76. int stabs[20][10];
  77. int qflg;
  78. char *wif[2];
  79. char *welse[2];
  80. char *wfor[2];
  81. char *wds[3];
  82. int j;
  83. char string[200];
  84. char cc;
  85. int sflg;
  86. int bflg;
  87. int peek;
  88. int tabs;
  89. char lastchar;
  90. char c;
  91.  
  92. main(argc, argv)
  93. int argc;
  94. char *argv[];
  95. {
  96.     int k;
  97.  
  98.     /*  Initialize everything here.  */
  99.  
  100.     dioinit(&argc, argv);
  101.  
  102.     if (!_dioinflg)
  103.     {
  104.         printf(
  105.         "\nUSAGE:\n");
  106.         printf(
  107.         "     cb  <input_fid  [>out_fid or |DIO_pipe or default = crt]\n\n");
  108.         printf(
  109.         "one of three formatting filters:\n\n");
  110.         printf(
  111.         "unvanuys - converts keywords of Van Nuys Toolkit to standard K & R 'c'\n");
  112.         printf(
  113.         "cbprep - produces consistent spacing of 'c' text and one statement per line\n");
  114.         printf(
  115.         "         output must be filtered by cb\n");
  116.         printf(
  117.         "cb - indents according to control level\n\n");
  118.         dioexit();
  119.     }
  120.  
  121.     clevel = iflev = level = eflg = paren = 0;
  122.     aflg = qflg = j = bflg = tabs = 0;
  123.     ifflg = peek = -1;
  124.     sflg = 1;
  125.     initw(ind, "0,0,0,0,0,0,0,0,0,0");
  126.     initw(pflg, "0,0,0,0,0,0,0,0,0,0");
  127.     wif[0] = "if";
  128.     welse[0] = "else";
  129.     wfor[0] = "for";
  130.     wds[0] = "case";
  131.     wds[1] = "default";
  132.     wif[1] = welse[1] = wfor[1] = wds[2] = 0;
  133.  
  134.     /*  End of initialization.  */
  135.  
  136.     while ((c = getchr()) != 0xff)
  137.     {
  138.         switch (c)
  139.         {
  140.         default :
  141.             string[j++] = c;
  142.             if (c != ',')
  143.                 lchar = c;
  144.             break;
  145.         case ' ' :
  146.         case '\t' :
  147.             if (lookup(welse) == 1)
  148.             {
  149.                 gotelse();
  150.                 if (sflg == 0 || j > 0)
  151.                     string[j++] = c;
  152.                 puts();
  153.                 sflg = 0;
  154.                 break;
  155.             }
  156.             if (sflg == 0 || j > 0)
  157.                 string[j++] = c;
  158.             break;
  159.         case '\n' :
  160.             if (eflg = lookup(welse) == 1)
  161.                 gotelse();
  162.             puts();
  163.             printf("\n");
  164.             sflg = 1;
  165.             if (eflg == 1)
  166.             {
  167.                 pflg[level]++;
  168.                 tabs++;
  169.             }
  170.             else
  171.                 if (pchar == lchar)
  172.                     aflg = 1;
  173.             break;
  174.         case '{' :
  175.             if (lookup(welse) == 1)
  176.                 gotelse();
  177.             siflev[clevel] = iflev;
  178.             sifflg[clevel] = ifflg;
  179.             iflev = ifflg = 0;
  180.             clevel++;
  181.             if (sflg == 1 && pflg[level] != 0)
  182.             {
  183.                 pflg[level]--;
  184.                 tabs--;
  185.             }
  186.             string[j++] = c;
  187.             puts();
  188.             getnl();
  189.             puts();
  190.             printf("\n");
  191.             tabs++;
  192.             sflg = 1;
  193.             if (pflg[level] > 0)
  194.             {
  195.                 ind[level] = 1;
  196.                 level++;
  197.                 slevel[level] = clevel;
  198.             }
  199.             break;
  200.         case '}' :
  201.             clevel--;
  202.             if ((iflev = siflev[clevel] - 1) < 0)
  203.                 iflev = 0;
  204.             ifflg = sifflg[clevel];
  205.             puts();
  206.             tabs--;
  207.             ptabs();
  208.             if ((peek = getchr()) == ';')
  209.             {
  210.                 printf("%c;", c);
  211.                 peek = -1;
  212.             }
  213.             else
  214.                 printf("%c", c);
  215.             getnl();
  216.             puts();
  217.             printf("\n");
  218.             sflg = 1;
  219.             if (clevel < slevel[level])
  220.                 if (level > 0)
  221.                     level--;
  222.             if (ind[level] != 0)
  223.             {
  224.                 tabs -= pflg[level];
  225.                 pflg[level] = 0;
  226.                 ind[level] = 0;
  227.             }
  228.             break;
  229.         case '"' :
  230.         case '\'' :
  231.             string[j++] = c;
  232.             while ((cc = getchr()) != c)
  233.             {
  234.                 string[j++] = cc;
  235.                 if (cc == '\\')
  236.                 {
  237.                     string[j++] = getchr();
  238.                 }
  239.                 if (cc == '\n')
  240.                 {
  241.                     puts();
  242.                     sflg = 1;
  243.                 }
  244.             }
  245.             string[j++] = cc;
  246.             if (getnl() == 1)
  247.             {
  248.                 lchar = cc;
  249.                 peek = '\n';
  250.             }
  251.             break;
  252.         case ';' :
  253.             string[j++] = c;
  254.             puts();
  255.             if (pflg[level] > 0 && ind[level] == 0)
  256.             {
  257.                 tabs -= pflg[level];
  258.                 pflg[level] = 0;
  259.             }
  260.             getnl();
  261.             puts();
  262.             printf("\n");
  263.             sflg = 1;
  264.             if (iflev > 0)
  265.                 if (ifflg == 1)
  266.                 {
  267.                     iflev--;
  268.                     ifflg = 0;
  269.                 }
  270.             else
  271.                 iflev = 0;
  272.             break;
  273.         case '\\' :
  274.             string[j++] = c;
  275.             string[j++] = getchr();
  276.             break;
  277.         case '?' :
  278.             qflg = 1;
  279.             string[j++] = c;
  280.             break;
  281.         case ':' :
  282.             string[j++] = c;
  283.             if (qflg == 1)
  284.             {
  285.                 qflg = 0;
  286.                 break;
  287.             }
  288.             if (lookup(wds) == 0)
  289.             {
  290.                 sflg = 0;
  291.                 puts();
  292.             }
  293.             else
  294.             {
  295.                 tabs--;
  296.                 puts();
  297.                 tabs++;
  298.             }
  299.             if ((peek = getchr()) == ';')
  300.             {
  301.                 printf(";");
  302.                 peek = -1;
  303.             }
  304.             getnl();
  305.             puts();
  306.             printf("\n");
  307.             sflg = 1;
  308.             break;
  309.         case '/' :
  310.             string[j++] = c;
  311.             if ((peek = getchr()) != '*')
  312.                 break;
  313.             string[j++] = peek;
  314.             peek = -1;
  315.             comment();
  316.             break;
  317.         case ')' :
  318.             paren--;
  319.             string[j++] = c;
  320.             puts();
  321.             if (getnl() == 1)
  322.             {
  323.                 peek = '\n';
  324.                 if (paren != 0)
  325.                     aflg = 1;
  326.                 else
  327.                     if (tabs > 0)
  328.                     {
  329.                         pflg[level]++;
  330.                         tabs++;
  331.                         ind[level] = 0;
  332.                     }
  333.             }
  334.             break;
  335.         case '#' :
  336.             string[j++] = c;
  337.             while ((cc = getchr()) != '\n')
  338.                 string[j++] = cc;
  339.             string[j++] = cc;
  340.             sflg = 0;
  341.             puts();
  342.             sflg = 1;
  343.             break;
  344.         case '(' :
  345.             string[j++] = c;
  346.             paren++;
  347.             if (lookup(wfor) == 1)
  348.             {
  349.                 while ((c = gets()) != ';')
  350.                     ;
  351.                 ct = 0;
  352. cont :
  353.                 while ((c = gets()) != ')')
  354.                 {
  355.                     if (c == '(')
  356.                         ct++;
  357.                 }
  358.                 if (ct != 0)
  359.                 {
  360.                     ct--;
  361.                     goto cont;
  362.                 }
  363.                 paren--;
  364.                 puts();
  365.                 if (getnl() == 1)
  366.                 {
  367.                     peek = '\n';
  368.                     pflg[level]++;
  369.                     tabs++;
  370.                     ind[level] = 0;
  371.                 }
  372.                 break;
  373.             }
  374.             if (lookup(wif) == 1)
  375.             {
  376.                 puts();
  377.                 stabs[clevel][iflev] = tabs;
  378.                 spflg[clevel][iflev] = pflg[level];
  379.                 sind[clevel][iflev] = ind[level];
  380.                 iflev++;
  381.                 ifflg = 1;
  382.             }
  383.         }
  384.     }
  385.     dioflush();
  386.     exit();
  387. }
  388. ptabs()
  389. {
  390.     int i;
  391.     for (i = 0; i < tabs; i++)
  392.         printf("\t");
  393. }
  394. getchr()
  395. {
  396.     int temp, tempchar;
  397.     if (peek < 0 && lastchar != ' ' && lastchar != '\t')
  398.         pchar = lastchar;
  399.     lastchar = (peek < 0) ? getchar() : peek;
  400.     if (lastchar == 0xff)
  401.     {
  402.         if (pchar != '\n')
  403.         {
  404.             puts();
  405.             printf("\n");
  406.         }
  407.         dioflush();
  408.         exit();
  409.     }
  410.     else
  411.         lastchar = (lastchar & 0x7f);
  412.     peek = -1;
  413.     return (lastchar == '\r' ? getchr() : lastchar);
  414. }
  415. puts()
  416. {
  417.     if (j > 0)
  418.     {
  419.         if (sflg != 0)
  420.         {
  421.             ptabs();
  422.             sflg = 0;
  423.             if (aflg == 1)
  424.             {
  425.                 aflg = 0;
  426.                 if (tabs > 0)
  427.                     printf("    ");
  428.             }
  429.         }
  430.         string[j] = '\0';
  431.         printf("%s", string);
  432.         j = 0;
  433.     }
  434.     else
  435.     {
  436.         if (sflg != 0)
  437.         {
  438.             sflg = 0;
  439.             aflg = 0;
  440.         }
  441.     }
  442. }
  443. lookup(tab)
  444. char *tab[];
  445. {
  446.     char r;
  447.     int l, kk, k, i;
  448.     if (j < 1)
  449.         return (0);
  450.     kk = 0;
  451.     while (string[kk] == ' ')
  452.         kk++;
  453.     for (i = 0; tab[i] != 0; i++)
  454.     {
  455.         l = 0;
  456.         for (k = kk; (r = tab[i][l++]) == string[k] && r != '\0'; k++)
  457.             ;
  458.         if (r == '\0' && (string[k] < 'a' || string[k] > 'z'))
  459.             return (1);
  460.     }
  461.     return (0);
  462. }
  463. gets()
  464. {
  465.     char ch;
  466. beg :
  467.     if ((ch = string[j++] = getchr()) == '\\')
  468.     {
  469.         string[j++] = getchr();
  470.         goto beg;
  471.     }
  472.     if (ch == '\'' || ch == '"')
  473.     {
  474.         while ((cc = string[j++] = getch